﻿// ===============================================================================
//  Copyright © NewSQL.CN. All rights reserved .
//  技术论坛：http://newsql.cn/
//  个人博客：http://www.ymind.net/
//  版权所有：NewSQL中文社区 彦铭工作室
// ===============================================================================

using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Builders;

namespace Newsql.Data.MongoDB
{
	/// <summary>
	/// 为 <see cref="BsonInt32Object"/> 的数据访问层提供基类。
	/// </summary>
	public abstract class BsonInt32ObjectDALBase<T> : AutoIncrementIdObjectDALBase<T, BsonInt32> where T : BsonInt32Object
	{
		/// <summary>
		/// 初始化 <see cref="BsonInt32ObjectDALBase{T}"/> 对象。
		/// </summary>
		/// <param name="masterGroup">主机连接字符串的分组名称。</param>
		protected BsonInt32ObjectDALBase(string masterGroup) : base(masterGroup) { }

		/// <summary>
		/// 初始化 <see cref="BsonInt32ObjectDALBase{T}"/> 对象。
		/// </summary>
		/// <param name="masterGroup">主机连接字符串的分组名称。</param>
		/// <param name="slaveGroup">从机连接字符串的分组名称。</param>
		protected BsonInt32ObjectDALBase(string masterGroup, string slaveGroup) : base(masterGroup, slaveGroup) { }

		/// <summary>
		/// 返回新的唯一标识符。
		/// </summary>
		/// <param name="database">保存唯一标识符的数据库对象。</param>
		/// <returns>返回表示唯一标识符的 <see cref="BsonInt64"/>。</returns>
		protected override BsonInt32 GetNewId(MongoDatabase database)
		{
			var collectionName = this.GetCollectionName(this.AutoIncrementCollectionName);
			var collection = database.GetCollection(collectionName);
			var resutl = collection.FindAndModify(Query.EQ("_id", this.CollectionName), SortBy.Null, global::MongoDB.Driver.Builders.Update.Inc("Index", 1), true, true);

			return resutl.ModifiedDocument["Index"].ToInt32();
		}
	}
}
